public class Animal {
    // 基类（父类）：动物类
    class Animal {
        private String name;

        public Animal(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        // 基类的普通方法
        public void eat() {
            System.out.println(name + " 正在吃东西。");
        }

        // 定义为final的方法，子类不能重写
        public final void sleep() {
            System.out.println(name + " 正在睡觉。");
        }
    }

    // 子类：猫类，继承自Animal类


    // 子类：狗类，继承自Animal类
    static class Dog extends Animal {
        public Dog(String name) {
            super(name);
        }

        // 重写父类的eat方法
        @Override
        public void eat() {
            System.out.println(getName() + " 正在吃骨头。");
        }

        // 子类新增的方法
        public void guard() {
            System.out.println(getName() + " 正在看家。");
        }
    }

    // 测试场景类
    class ZooTest {
        public static void main(String[] args) {
            // 创建猫对象
            Cat cat = new Cat("小花");
            cat.eat();
            cat.catchMouse();
            cat.sleep();

            // 创建狗对象
            Dog dog = new Dog("小黑");
            dog.eat();
            dog.guard();
            dog.sleep();

            // 对象向上转型测试多态性
            Animal animal1 = new Cat("小白");
            Animal animal2 = new Dog("小黄");

            animal1.eat();
            ((Cat) animal1).catchMouse(); // 需要向下转型才能调用子类特有的方法

            animal2.eat();            ((Dog) animal2).guard(); // 需要向下转型才能调用子类特有的方法
        }
    }
}
